package main

import (
	"bytes"
	"fmt"
	"os/exec"
	"runtime"
	"time"
)

var ClientCfg *ClientConfig = nil

var intervl int = 0

var timer *time.Ticker

var host string

func main() {

	startCli()

}

func startCli() {
	if initCfg() {
		fmt.Println("start client")

		host = fmt.Sprintf("http://%s:%s", ClientCfg.ServerAddr, ClientCfg.ServerPort)
		//跟服务端获取周期时间
		data, err := HttpGet(host, "lxtime")

		if data == nil || err != nil {
			for {
				time.Sleep(30 * time.Second)
				data, err = HttpGet(host, "lxtime")
				if data != nil && err == nil {
					fmt.Println("loop get lxtime ok")
					break
				}
				fmt.Println("loop get lxtime")
			}
		} else {
			//goto LABEL
			//fmt.Println("test")
			//fmt.Printf("%v,%v\n", data, err)
			//time.Sleep(30 * time.Second)
			//startCli()
		}
		if data.Code == 0 {
			intervl = StrToInt(data.Data)

			if intervl > 0 {

				timer = time.NewTicker(time.Duration(intervl) * time.Second) //启动定时器，生产一个Timer对象
				//启动定时器
				starTimer()
			} else {
				fmt.Println("get lunxun time error")
				return
			}

		} else {
			fmt.Println("get lunxun time error")
			return
		}

	} else {
		fmt.Println("conf error")
	}
}

func initCfg() bool {
	ClientCfg = NewCliCfg("conf.ini")
	if ClientCfg == nil {
		return false
	}
	if ClientCfg.ServerAddr == "" || ClientCfg.ServerPort == "" {
		return false
	}
	return true
}

func starTimer() {

	for range timer.C {
		shutdownpc()
	}
}

func shutdownpc() {
	//获取是否关机
	data, err := HttpGet(host, "shutdown")
	if data != nil && err == nil {
		fmt.Printf("%v\n", data)
		if data.Data == "shutdown" {
			shutdown()
		} else {
			i := StrToInt(data.Data)
			fmt.Printf("data:%d intervl:%d\n", i, intervl)
			if i != intervl {
				timer.Stop()
				startCli()
			}
		}
		//shutdown()
	} else {
		//服务端有可能关了
		fmt.Println("aaa")
		fmt.Printf("%v  %v\n", data, err)
		timer.Stop()
		startCli()

	}
}

func shutdown() {
	op := runtime.GOOS
	if op == "linux" {
		if result, err := closelinux(); err != nil {
			fmt.Println("error:", err)
		} else {
			fmt.Println("exec succ ", result)
		}
	} else if op == "windows" {
		if result, err := closewindows(); err != nil {
			fmt.Println("error:", err)
		} else {
			fmt.Println("exec succ ", result)
		}
	}
}

func closelinux() (string, error) {
	//函数返回一个*Cmd，用于使用给出的参数执行name指定的程序
	cmd := exec.Command("shutdown", "-h", "now")

	//读取io.Writer类型的cmd.Stdout，再通过bytes.Buffer(缓冲byte类型的缓冲器)将byte类型转化为string类型(out.String():这是bytes类型提供的接口)
	var out bytes.Buffer
	cmd.Stdout = &out

	//Run执行c包含的命令，并阻塞直到完成。  这里stdout被取出，cmd.Wait()无法正确获取stdin,stdout,stderr，则阻塞在那了
	err := cmd.Run()
	return out.String(), err
}

func closewindows() (string, error) {
	//函数返回一个*Cmd，用于使用给出的参数执行name指定的程序
	cmd := exec.Command("shutdown", "-s", "-t", "0")

	//读取io.Writer类型的cmd.Stdout，再通过bytes.Buffer(缓冲byte类型的缓冲器)将byte类型转化为string类型(out.String():这是bytes类型提供的接口)
	var out bytes.Buffer
	cmd.Stdout = &out

	//Run执行c包含的命令，并阻塞直到完成。  这里stdout被取出，cmd.Wait()无法正确获取stdin,stdout,stderr，则阻塞在那了
	err := cmd.Run()
	return out.String(), err
}
